<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Doc Values | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/docvalues.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/docvalues.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/docvalues.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/docvalues.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="docvalues-and-fielddata.html">Doc Values and Fielddata</a></span>
»
<span class="breadcrumb-node">Doc Values</span>
</div>
<div class="navheader">
<span class="prev">
<a href="docvalues-and-fielddata.html">« Doc Values and Fielddata</a>
</span>
<span class="next">
<a href="_deep_dive_on_doc_values.html">深入理解 Doc Values »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="docvalues"></a>Doc Values<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/90_docvalues.asciidoc">edit</a>
</h2>
</div></div></div>
<p>聚合使用一个叫 <em>doc values</em> 的数据结构（在 <a class="xref" href="docvalues-intro.html" title="Doc Values 介绍">Doc Values 介绍</a> 里简单介绍）。 Doc values 可以使聚合<b>更快</b>、<b>更高效</b>且<b>内存友好</b>，所以理解它的工作方式十分有益。</p>
<p>Doc values 的存在是因为倒排索引(inverted index)只对某些操作是高效的。
倒排索引的优势  在于查找包含某个项的文档，而对于从另外一个方向的相反操作并不高效，即：确定哪些项是否存在单个文档里，聚合需要这种辅助(次要的, secondary)访问模式。</p>
<p>对于以下倒排索引：</p>
<pre class="literallayout">Term      Doc_1   Doc_2   Doc_3
------------------------------------
brown   |   X   |   X   |
dog     |   X   |       |   X
dogs    |       |   X   |   X
fox     |   X   |       |   X
foxes   |       |   X   |
in      |       |   X   |
jumped  |   X   |       |   X
lazy    |   X   |   X   |
leap    |       |   X   |
over    |   X   |   X   |   X
quick   |   X   |   X   |   X
summer  |       |   X   |
the     |   X   |       |   X
------------------------------------</pre>

<p>如果我们想要获得所有包含 <code class="literal">brown</code> 的文档的词的完整列表，我们会创建如下查询：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET /my_index/_search
{
  "query" : {
    "match" : {
      "body" : "brown"
    }
  },
  "aggs" : {
    "popular_terms": {
      "terms" : {
        "field" : "body"
      }
    }
  }
}</pre>
</div>
<p>查询部分简单又高效。倒排索引是根据 词项(term) 来排序的，所以我们首先在词项列表中找到 <code class="word">brown</code> ，然后扫描所有列，找到包含 <code class="word">brown</code> 的文档。我们可以快速看到 <code class="literal">Doc_1</code> 和 <code class="literal">Doc_2</code> 包含 <code class="word">brown</code> 这个 token。</p>
<p>然后，对于聚合部分，我们需要找到 <code class="literal">Doc_1</code> 和 <code class="literal">Doc_2</code> 里所有唯一的词项。 用倒排索引做这件事情代价很高：
我们会迭代索引里的每个词项并收集 <code class="literal">Doc_1</code> 和 <code class="literal">Doc_2</code> 列里的 词元(token)。这很慢而且难以扩展：随着词项和文档的数量增加，执行时间也会增加。</p>

<p>Doc values 通过反转两者间的关系来解决这个问题。倒排索引将词项映射到包含它们的文档，doc values 将文档映射到它们包含的词项：</p>
<pre class="literallayout">Doc      Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_3 | dog, dogs, fox, jumped, over, quick, the
-----------------------------------------------------------------</pre>
<p style="color:#666; ">
&gt; 译者注: 这就好像 doc values 这个词语表面上的意思那样: 文档的值(分词后的词元, token)
</p>
<p>当数据被转置之后，想要收集到 <code class="literal">Doc_1</code> 和 <code class="literal">Doc_2</code> 的唯一 词元(token) 会非常容易。获得每个文档行，获取所有的词项，然后求两个集合的并集。</p>
<p>因此，搜索和聚合是相互紧密缠绕的。搜索使用倒排索引查找文档，聚合操作收集和聚合 doc values 里的数据。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Doc values 不仅可以用于聚合。 任何需要查找某个文档包含的值的操作都必须使用它。
除了聚合，还包括排序、访问字段值的脚本、父子关系处理（见 <a href="parent-child.html" title="父-子关系">父-子关系</a> ）。</p>
</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="docvalues-and-fielddata.html">« Doc Values and Fielddata</a>
</span>
<span class="next">
<a href="_deep_dive_on_doc_values.html">深入理解 Doc Values »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>